{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "Linear Regression.ipynb",
      "provenance": [],
      "include_colab_link": true
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/yananma/useful_program/blob/master/DL/PyTorch/Linear_Regression.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "V9IPfQAY060r",
        "colab_type": "text"
      },
      "source": [
        "## Linear Regression"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "B3FMjjUT2nGW",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "import torch \n",
        "import torch.nn as nn \n",
        "import numpy as np \n",
        "import matplotlib.pyplot as plt \n",
        "%matplotlib inline "
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "jU_K7V1iTGRW",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "# Hyper parameters \n",
        "input_size = 1 \n",
        "output_size = 1 \n",
        "num_epochs = 3000 \n",
        "learning_rate = 0.001 "
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "baOX7sJaTeaG",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "# data \n",
        "x = np.random.rand(256)\n",
        "noise = np.random.randn(256) / 4 \n",
        "y = 5 * x + 7 + noise\n",
        "\n",
        "x_train = x.reshape(-1, 1).astype('float32')\n",
        "y_train = y.reshape(-1, 1).astype('float32')"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "3kkyK8JeViq4",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "# model\n",
        "model = nn.Linear(input_size, output_size)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "IemdI7vdVnG_",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "# loss and optimizer \n",
        "criterion = nn.MSELoss()\n",
        "optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "sY_sDq7xV6Sw",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 544
        },
        "outputId": "a5f3b2dd-f548-4f93-bf12-0d54e098cb9b"
      },
      "source": [
        "# train \n",
        "loss_dict = []\n",
        "for epoch in range(num_epochs):\n",
        "    inputs = torch.from_numpy(x_train)\n",
        "    targets = torch.from_numpy(y_train)\n",
        "\n",
        "    # forward pass\n",
        "    outputs = model(inputs)\n",
        "    loss = criterion(outputs, targets)\n",
        "\n",
        "    # backward and oprimize\n",
        "    optimizer.zero_grad()\n",
        "    loss.backward()\n",
        "    optimizer.step()\n",
        "\n",
        "    loss_dict.append(loss.item())\n",
        "    if (epoch+1) % 100 == 0:\n",
        "        print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item()))"
      ],
      "execution_count": 6,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Epoch [100/3000], Loss: 52.9107\n",
            "Epoch [200/3000], Loss: 31.2525\n",
            "Epoch [300/3000], Loss: 18.4709\n",
            "Epoch [400/3000], Loss: 10.9278\n",
            "Epoch [500/3000], Loss: 6.4762\n",
            "Epoch [600/3000], Loss: 3.8491\n",
            "Epoch [700/3000], Loss: 2.2988\n",
            "Epoch [800/3000], Loss: 1.3838\n",
            "Epoch [900/3000], Loss: 0.8438\n",
            "Epoch [1000/3000], Loss: 0.5251\n",
            "Epoch [1100/3000], Loss: 0.3371\n",
            "Epoch [1200/3000], Loss: 0.2261\n",
            "Epoch [1300/3000], Loss: 0.1606\n",
            "Epoch [1400/3000], Loss: 0.1219\n",
            "Epoch [1500/3000], Loss: 0.0991\n",
            "Epoch [1600/3000], Loss: 0.0856\n",
            "Epoch [1700/3000], Loss: 0.0776\n",
            "Epoch [1800/3000], Loss: 0.0729\n",
            "Epoch [1900/3000], Loss: 0.0701\n",
            "Epoch [2000/3000], Loss: 0.0685\n",
            "Epoch [2100/3000], Loss: 0.0675\n",
            "Epoch [2200/3000], Loss: 0.0669\n",
            "Epoch [2300/3000], Loss: 0.0666\n",
            "Epoch [2400/3000], Loss: 0.0664\n",
            "Epoch [2500/3000], Loss: 0.0663\n",
            "Epoch [2600/3000], Loss: 0.0662\n",
            "Epoch [2700/3000], Loss: 0.0661\n",
            "Epoch [2800/3000], Loss: 0.0661\n",
            "Epoch [2900/3000], Loss: 0.0661\n",
            "Epoch [3000/3000], Loss: 0.0660\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "4IxstNA1W_Ng",
        "colab_type": "code",
        "outputId": "a2933184-d511-4b78-cf69-3a9dc749f083",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        }
      },
      "source": [
        "[w, b] = model.parameters()\n",
        "print(w.item(), b.item())"
      ],
      "execution_count": 7,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "4.941791534423828 7.05049991607666\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "FFCAgAt0XJ6w",
        "colab_type": "code",
        "outputId": "cbf07253-3329-45f1-fdc8-7c4ec86947d5",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 269
        }
      },
      "source": [
        "# plot\n",
        "predicted = model(torch.from_numpy(x_train)).detach().numpy()\n",
        "plt.plot(x_train, y_train, 'bo', label='Orignial data', alpha=0.3)\n",
        "plt.plot(x_train, predicted, label='Fitted line')\n",
        "plt.legend()\n",
        "plt.show()"
      ],
      "execution_count": 8,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\ncQC+uwN+Ye8AAAAASUVORK5CYII=\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "IytPRNY0hOqN",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 269
        },
        "outputId": "e3bcf643-d3e7-4456-95bf-b4b25e6b6ea9"
      },
      "source": [
        "plt.plot(loss_dict, label='loss for every epoch')\n",
        "plt.legend()\n",
        "plt.show()"
      ],
      "execution_count": 9,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nQmCC\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "vxRhtphOXrpw",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "# save the model checkpoint\n",
        "torch.save(model.state_dict(), 'model.ckpt')"
      ],
      "execution_count": 0,
      "outputs": []
    }
  ]
}